package top.huntwolf.admin.converter;

import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.JSONLexer;
import com.alibaba.fastjson.parser.JSONToken;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import top.huntwolf.admin.common.enums.EnumValue;

import java.io.IOException;
import java.lang.reflect.Type;

public class EnumConverter implements ObjectSerializer, ObjectDeserializer {
    @Override
    public <T> T deserialze(DefaultJSONParser defaultJSONParser, Type type, Object o) {
        Class enumType = (Class) type;

        // 类型校验：枚举类型并且实现 EnumValue 接口
        if (!enumType.isEnum() || !EnumValue.class.isAssignableFrom(enumType)){
            return null;
        }

        final JSONLexer lexer = defaultJSONParser.lexer;
        final int token = lexer.token();
        Object value = null;
        if (token == JSONToken.LITERAL_INT){
            value = lexer.integerValue();
        }else if (token == JSONToken.LITERAL_STRING){
            value = lexer.stringVal();
        }else if (token != JSONToken.NULL){
            value = defaultJSONParser.parse();
        }

        return (T) EnumValue.valueOf(enumType,value);
    }

    @Override
    public int getFastMatchToken() {
        return JSONToken.LITERAL_STRING;
    }

    @Override
    public void write(JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i) throws IOException {
        //将枚举类通过desc输出
        o = o instanceof EnumValue ? ((EnumValue) o).desc() : o;
        jsonSerializer.write(o);
    }



}
